package com.sunlake.spring.main.model.account.service;

import com.sunlake.spring.main.common.response.R;
import com.sunlake.spring.main.model.account.dto.AccountRechargeDTO;
import com.sunlake.spring.main.model.account.dto.FreezeBalanceDTO;
import com.sunlake.spring.main.model.account.dto.RefundToBalanceDTO;
import com.sunlake.spring.main.model.account.dto.UnfreezeBalanceDTO;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Map;

/**
 * @author liuhanzhi49
 */
public interface AccountService {
    R getAccountBalance(Long userId);

    R recharge(Long userId, AccountRechargeDTO rechargeDTO);

    R getAccountRechargeRecords(Long userId);

    R getAccountConsumptionRecords(Long userId);

    boolean updateBalanceAfterPayment(String rechargeNo, String transactionNo);

    R checkRechargeStatus(String rechargeNo);

    // 添加获取余额明细的方法
    R getAccountBalanceRecords(
            Long userId,
            String recordType,
            LocalDateTime startDate,
            LocalDateTime endDate,
            Integer page,
            Integer pageSize);

    /**
     * 冻结用户余额
     * @param userId 用户ID
     * @param freezeDTO 冻结请求参数
     * @return 冻结结果
     */
    R freezeBalance(Long userId, FreezeBalanceDTO freezeDTO);

    /**
     * 解冻用户余额
     * @param userId 用户ID
     * @param unfreezeDTO 解冻请求参数
     * @return 解冻结果
     */
    R unfreezeBalance(Long userId, UnfreezeBalanceDTO unfreezeDTO);

    /**
     * 将金额返还到用户余额
     * @param userId 用户ID
     * @param refundDTO 返还请求参数
     * @return 返还结果
     */
    R refundToBalance(Long userId, RefundToBalanceDTO refundDTO);

    /**
     * 使用余额支付订单
     * @param userId 用户ID
     * @param orderNo 订单号
     * @param amount 支付金额
     * @return 支付结果
     */
    boolean payWithBalance(Long userId, String orderNo, BigDecimal amount);
}